package 线程;
//测试多线程-----读写锁的应用【优化】
/*
需求：四个线程窗口售票100张
要求：不用同步锁，使用读写锁完成
 */
import java.util.concurrent.locks.ReentrantReadWriteLock;

public class TestWriteReadLock读写锁 {
    public static void main(String[] args) {
        Ticket3 t = new Ticket3();
        Thread t1 = new Thread(t);
        Thread t2 = new Thread(t);
        Thread t3 = new Thread(t);
        Thread t4 = new Thread(t);
        t1.start();
        t2.start();
        t3.start();
        t4.start();

    }
}
//创建售票类，并实现Runnable接口
class Ticket3 implements Runnable {
    //注意声明静态
  static   int tickets = 100;
  //方法外;手动定义一个读写锁对象！！！注意设置为static静态--全局唯一
   ReentrantReadWriteLock lock  =   new ReentrantReadWriteLock(true);//true:保证多个线程正常读写【重点】
//重写ruN方法
    @Override
    public void run() {
        //不在使用同步锁(位置：循环外)，使用读写锁（位置：循环内）
        while(true){//循环卖票
            //@上锁--调用
            lock.writeLock().lock();
            if(tickets>0){
                try {
                    Thread.sleep(10);//休眠10毫秒
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName()+"="+tickets--);
            }else if(tickets<=0){
                break;
            }
            //@解锁[释放锁]
            lock.writeLock().unlock();
        }
    }
}
/*
 结果显示：Thread-1=100 ~~~~~~~ Thread-2=1
 */